package com.rr.controller;

import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.stp.parameter.SaLogoutParameter;
import cn.dev33.satoken.stp.parameter.enums.SaLogoutRange;
import cn.dev33.satoken.util.SaResult;
import com.rr.entity.Users;
import com.rr.service.UsersService;
import com.rr.utils.core.TableDataInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("user")
public class UserController extends  BaseController{

    @Autowired
    private UsersService usersService;
    @RequestMapping("doLogin")
    //userid   username userPassword
    public SaResult doLogin(@RequestBody  Users user) {
        if (user.getUserPassword() ==null && user.getUsername()==null) {
            return SaResult.error("登录过期 或从未登录").setCode(508);
        }
        Users lUser = usersService.login(user.getUsername(), user.getUserPassword());
        if (lUser == null) {
            return SaResult.error("用户名或密码错误").setCode(505);
        }
        //登录成功

        StpUtil.login(lUser.getUserid());
        StpUtil.getSession().set("user", lUser);
        return SaResult.ok()
                .setData(lUser)
                .setMsg("登录成功")
                .set(StpUtil.getTokenName(), StpUtil.getTokenValue());
    }

    /**
     * 退出登录
     */

    @RequestMapping("logout")
    @SaCheckLogin
    public SaResult logout() {
        //判断下 过期抛异常
        StpUtil.getLoginId();

           StpUtil.logout(new SaLogoutParameter()
                   // 注销范围： TOKEN=只注销当前 token 的会话，ACCOUNT=注销当前 token 指向的 loginId 其所有客户端会话
                   // 此参数只在调用 StpUtil.logout() 时有效
                   .setRange(SaLogoutRange.TOKEN));


        return SaResult.ok("退出登录成功");
    }



    @GetMapping("info")
    @SaCheckRole("1")
    public String test() {
        StpUtil.getRoleList().forEach(System.out::println);
        return "test";
    }
    @GetMapping("isLogin")
    public SaResult isLogin () {
        /**
         * 判断是否登录 是的话直接命中缓存 返回信息
         */
        if (StpUtil.isLogin()) {
            //续期
            StpUtil.renewTimeout(2592000);
            //缓存命中
            Users users = StpUtil.getSession().get("user", new Users());
            return SaResult.ok("用户已经登录自动跳转")
                    .setData(users)
                    .set(StpUtil.getTokenName(), StpUtil.getTokenValue());
        }else
            return SaResult.error("用户未登录").setCode(508);
    }
    //***************************crud*********************************************

    /**
     * 条件搜索
     * @param users
     * @return
     */
    @GetMapping("getAllUserInfo")
    @SaCheckRole("1")
    /**
     * 管理员才能看 无序命中缓存
     */
    public TableDataInfo getAllUserInfo(Users users) {
        startPage();
        List<Users> query = usersService.queryAllUsers(users);
        return getDataTable(query);
    }
}
